#ifdef __GPIO_PIN_CTR__
#define __GPIO_PIN_CTR__

#include "../../platform/include/platform.hpp"

struct pins{
    std::string info; //对每个pin 的使用作出说明，方便排查错误信息 设备的用途,
    uint32_t pin;  
    bool st;          //查看pin 脚的使用状态 True 正在使用  False 没有在使用
};

enum DIR{
    OUTPUT,
    INPUT,
};

enum LEVEL{
    LOW,  //低电平
    HIGH, //高电平
};
//TODO: 在json 中的命名规则，补充完整才能使用
//TODO: pin-sda 识别为pin 做gpio 的映射的, sda 为管脚的作用
//TODO: 可以使用多个pin脚,记录使用的pin脚信息
//TODO: 使用分号分割一组gpio 管脚
//TODO： 在一行上分割最多分割出5个pin脚 出来
class gpio:public device{                       //TODO： 单个设备的gpio 使用方法
private:
    std::vector<pins> gpio;                     //TODO:公用的数据区域,pin脚的数据池子 
    std::string dev_name;
public:
    gpio(std::string name):dev_name(name){}     //TODO:设备使用的gpio的名字
    virtual void config(json& fp);              //可以对所有的gpio,pin角 完成映射,决定是否是mmap 或者 是fs /class/gpio 的使用方法
    virtual void read(int reg,void *buf);       //通用的gpio 读的api
    virtual void write(int reg,void *buf);      //通用的gpio 写的api
    virtual void info();                        //查看GPIO 所有的映射信息
    virtual std::string get_dev_type();         //查看设备的类型
    void device_gpio_table_add(device* dev);    //TODO：设备 gpio 的使用信息
    void device_gpio_table_del(device* dev);    //TODO： 删除gpio 设备的管映射
    void set_dir(DIR dir);                      //每个gpio 单独的设置方法
    void set_low();                             //设置低电平
    void set_high();                            //设置高电平
    void switch_status(pins pin);               //TODO: 切换pin 脚的状态,info的信息也会发生改变
};

#endif /*__GPIO_PIN_CTR__*/
